2 #ifndef FRAMELIB_BLOCK_H 3 #define FRAMELIB_BLOCK_H 22 typedef void (T::*Method)(
Queue *);
26 Queue() : mMethod(NULL), mTop(NULL), mTail(NULL) {}
27 Queue(T *
object, Method method) : mMethod(NULL), mTop(NULL), mTail(NULL) {
add(
object, method); }
29 void add(T *
object, Method method)
33 if (object->FrameLib_Queueable<T>::mNext != NULL)
41 mFirst = mTop = mTail = object;
46 (
object->*method)(
this);
47 mTop =
object->FrameLib_Queueable<T>::mNext;
48 object->FrameLib_Queueable<T>::mNext = NULL;
52 mFirst = mTail = NULL;
56 assert (method == mMethod &&
"Cannot add items to open queue for another method");
60 mTail->FrameLib_Queueable<T>::mNext = object;
109 typedef typename std::vector< T *>::iterator ObjectIterator;
110 typedef typename std::vector<Connection>::iterator ConnectionIterator;
111 typedef typename std::vector<Connection>::const_iterator ConstConnectionIterator;
120 : mType(type), mContext(context), mAllocator(context), mOwner(owner), mParent(parent), mNumIns(0), mNumOuts(0), mNumAudioChans(0), mSupportsOrderingConnections(false), mFeedback(false) {}
145 virtual void setFixedInput(
unsigned long idx,
double *input,
unsigned long size) = 0;
151 virtual void blockUpdate(
double **ins,
double **outs,
unsigned long blockSize) = 0;
152 virtual void reset(
double samplingRate,
unsigned long maxBlockSize) = 0;
160 virtual std::string
objectInfo(
bool verbose =
false) {
return "No object info available"; }
161 virtual std::string
inputInfo(
unsigned long idx,
bool verbose =
false) {
return "No input info available"; }
162 virtual std::string
outputInfo(
unsigned long idx,
bool verbose =
false) {
return "No output info available"; }
163 virtual std::string
audioInfo(
unsigned long idx,
bool verbose =
false) {
return "No audio channel info available"; }
165 virtual FrameType inputType(
unsigned long idx)
const = 0;
166 virtual FrameType outputType(
unsigned long idx)
const = 0;
183 T *prevObject = mConnections[inIdx].mObject;
184 mConnections[inIdx] = Connection(
object, outIdx);
188 if (prevObject !=
object)
190 connectionRemoved(&queue, prevObject);
191 object->addOutputDependency(&queue, mParent);
194 connectionUpdate(&queue);
204 clearConnection(&queue, inIdx);
205 connectionUpdate(&queue);
210 if (!supportsOrderingConnections())
220 for (ConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); it++)
221 if (it->mObject ==
object && it->mIndex == outIdx)
226 mOrderingConnections.push_back(Connection(
object, outIdx));
230 object->addOutputDependency(&queue, mParent);
232 connectionUpdate(&queue);
242 for (ConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); it++)
244 if (it->mObject ==
object && it->mIndex == outIdx)
246 deleteOrderingConnection(&queue, it);
251 connectionUpdate(&queue);
258 deleteOrderingConnections(&queue);
259 connectionUpdate(&queue);
268 for (
unsigned long i = 0; i < mConnections.size(); i++)
269 clearConnection(&queue, i);
273 deleteOrderingConnections(&queue);
277 for (ObjectIterator it = mOutputDependencies.begin(); it != mOutputDependencies.end(); )
279 (*it)->disconnect(&queue, mParent);
280 it = mOutputDependencies.erase(it);
283 connectionUpdate(&queue);
288 return mConnections[inIdx].mObject != NULL;
291 virtual void autoOrderingConnections() = 0;
292 virtual void clearAutoOrderingConnections() = 0;
296 T *
getConnection(
unsigned long idx)
const {
return mConnections[idx].mObject; }
297 unsigned long getConnectionIdx(
unsigned long idx)
const {
return mConnections[idx].mIndex; }
306 for (ConstConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); it++)
307 if (it->mObject ==
object)
320 void setIO(
unsigned long nIns,
unsigned long nOuts,
unsigned long nAudioChans = 0)
322 mNumIns = (getType() ==
kScheduler || nIns) ? nIns : 1;
324 mNumAudioChans = nAudioChans;
326 mConnections.resize(mNumIns);
335 template <
class U> U *
alloc(
unsigned long N)
337 return reinterpret_cast<U *
>(mAllocator->alloc(
sizeof(U) * N));
342 mAllocator->dealloc(ptr);
352 mAllocator->releaseStorage(storage->
getName());
358 static const char *
formatInfo(
const char *verboseStr,
const char *briefStr,
bool verbose)
360 return verbose ? verboseStr : briefStr;
363 static std::string
formatInfo(
const char *verboseStr,
const char *briefStr,
unsigned long idx,
bool verbose)
365 std::string info = formatInfo(verboseStr, briefStr, verbose);
366 std::string idxStr = numberedString(
"", idx + 1);
368 for (
size_t pos = info.find(
"#", 0); pos != std::string::npos; pos = info.find(
"#", pos + 1))
369 info.replace(pos, 1, idxStr);
374 static std::string
formatInfo(
const char *verboseStr,
const char *briefStr,
const char *replaceStr,
bool verbose)
376 std::string info = formatInfo(verboseStr, briefStr, verbose);
378 for (
size_t pos = info.find(
"#", 0); pos != std::string::npos; pos = info.find(
"#", pos + 1))
379 info.replace(pos, 1, replaceStr);
388 std::ostringstream outStr;
400 virtual void connectionUpdate(Queue *queue) = 0;
409 if (object->mContext != mContext)
412 if (detectFeedback(
object))
420 void addOutputDependency(Queue *queue, T *
object)
422 for (ObjectIterator it = mOutputDependencies.begin(); it != mOutputDependencies.end(); it++)
426 mOutputDependencies.push_back(
object);
427 connectionUpdate(queue);
430 void deleteOutputDependency(Queue *queue, T *
object)
432 for (ObjectIterator it = mOutputDependencies.begin(); it != mOutputDependencies.end(); it++)
436 mOutputDependencies.erase(it);
437 connectionUpdate(queue);
445 void connectionRemoved(Queue *queue, T *
object)
452 for (ConnectionIterator it = mConnections.begin(); it != mConnections.end(); it++)
453 if (it->mObject ==
object)
456 for (ConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); it++)
457 if (it->mObject ==
object)
462 object->deleteOutputDependency(queue, mParent);
467 void clearConnection(Queue *queue,
unsigned long inIdx)
469 T *prevObject = mConnections[inIdx].mObject;
470 mConnections[inIdx] = Connection();
471 connectionRemoved(queue, prevObject);
476 ConnectionIterator deleteOrderingConnection(Queue *queue, ConnectionIterator it)
478 T *
object = it->mObject;
479 it = mOrderingConnections.erase(it);
480 connectionRemoved(queue,
object);
487 void deleteOrderingConnections(Queue *queue)
489 for (ConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); )
490 it = deleteOrderingConnection(queue, it);
495 void disconnect(Queue *queue, T *
object)
497 for (ConnectionIterator it = mConnections.begin(); it != mConnections.end(); it++)
498 if (it->mObject ==
object)
501 for (ConnectionIterator it = mOrderingConnections.begin(); it != mOrderingConnections.end(); )
503 if (it->mObject ==
object)
504 it = mOrderingConnections.erase(it);
509 connectionUpdate(queue);
514 bool detectFeedback(T *
object)
516 object->mFeedback =
false;
517 Queue queue(mParent, &T::feedbackProbe);
518 return object->mFeedback;
521 void feedbackProbe(Queue *queue)
524 for (
typename std::vector <T *>::iterator it = mOutputDependencies.begin(); it != mOutputDependencies.end(); it++)
525 queue->add(*it, &T::feedbackProbe);
539 unsigned long mNumIns;
540 unsigned long mNumOuts;
541 unsigned long mNumAudioChans;
545 std::vector<Connection> mOrderingConnections;
546 std::vector<Connection> mConnections;
547 std::vector<T *> mOutputDependencies;
549 bool mSupportsOrderingConnections;
576 virtual unsigned long getNumInputObjects(
unsigned long blockIdx) = 0;
578 virtual unsigned long getInputObjectIdx(
unsigned long blockIdx,
unsigned long idx) = 0;
ObjectType
Definition: FrameLib_Types.h:24
unsigned long getConnectionIdx(unsigned long idx) const
Definition: FrameLib_Object.h:297
bool isConnected(unsigned long inIdx) const
Definition: FrameLib_Object.h:286
virtual std::string objectInfo(bool verbose=false)
Definition: FrameLib_Object.h:160
void deleteConnection(unsigned long inIdx)
Definition: FrameLib_Object.h:200
virtual const FrameLib_Parameters * getParameters() const
Definition: FrameLib_Object.h:170
unsigned long getOrderingConnectionIdx(unsigned long idx) const
Definition: FrameLib_Object.h:302
Queue(T *object, Method method)
Definition: FrameLib_Object.h:27
unsigned long getNumOuts() const
Definition: FrameLib_Object.h:138
Definition: FrameLib_Parameters.h:21
unsigned long getNumOrderingConnectionObjects()
Definition: FrameLib_DSP.h:168
virtual ~FrameLib_Block()
Definition: FrameLib_Object.h:568
Definition: FrameLib_Context.h:10
T * getOutputDependency(unsigned long idx) const
Definition: FrameLib_Object.h:314
virtual unsigned long getOutputObjectIdx(unsigned long blockIdx)
Definition: FrameLib_DSP.h:166
void dealloc(U *&ptr)
Definition: FrameLib_Object.h:340
Definition: FrameLib_Types.h:26
Definition: FrameLib_DSP.h:17
FrameLib_LocalAllocator::Storage * registerStorage(const char *name)
Definition: FrameLib_Object.h:348
unsigned long getNumAudioChans() const
Definition: FrameLib_Object.h:141
virtual std::string outputInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:162
virtual void setChannel(unsigned long chan)
Definition: FrameLib_Object.h:572
unsigned long mIndex
Definition: FrameLib_Object.h:103
FrameLib_DSP * getOutputObject(unsigned long blockIdx)
Definition: FrameLib_DSP.h:165
Definition: FrameLib_Object.h:13
T * getFirst() const
Definition: FrameLib_Object.h:65
static std::string formatInfo(const char *verboseStr, const char *briefStr, const char *replaceStr, bool verbose)
Definition: FrameLib_Object.h:374
ObjectType getType() const
Definition: FrameLib_Object.h:125
Queue()
Definition: FrameLib_Object.h:26
FrameLib_DSP * getInputObject(unsigned long blockIdx, unsigned long idx)
Definition: FrameLib_DSP.h:162
const char * getName() const
Definition: FrameLib_Memory.h:230
Definition: FrameLib_Object.h:91
void clearConnections()
Definition: FrameLib_Object.h:262
U * mObject
Definition: FrameLib_Object.h:102
unsigned long getNumOutputDependencies() const
Definition: FrameLib_Object.h:313
Definition: FrameLib_Types.h:26
FrameLib_Block(ObjectType type, FrameLib_Context context, void *owner)
Definition: FrameLib_Object.h:566
Definition: FrameLib_Object.h:97
virtual unsigned long getInputObjectIdx(unsigned long blockIdx, unsigned long idx)
Definition: FrameLib_DSP.h:163
FrameLib_Object(ObjectType type, FrameLib_Context context, void *owner, T *parent)
Definition: FrameLib_Object.h:119
ConnectionResult addOrderingConnection(T *object, unsigned long outIdx)
Definition: FrameLib_Object.h:208
Definition: FrameLib_Types.h:26
void clearAllocator()
Definition: FrameLib_Object.h:346
virtual std::string inputInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:161
FrameLib_DSP * getOrderingConnectionObject(unsigned long idx)
Definition: FrameLib_DSP.h:169
FrameLib_Context getContext() const
Definition: FrameLib_Object.h:129
T * getOrderingConnection(unsigned long idx) const
Definition: FrameLib_Object.h:301
ConnectionResult addConnection(T *object, unsigned long outIdx, unsigned long inIdx)
Definition: FrameLib_Object.h:174
void clearOrderingConnections()
Definition: FrameLib_Object.h:254
bool supportsOrderingConnections() const
Definition: FrameLib_Object.h:299
bool isOrderingConnection(T *object) const
Definition: FrameLib_Object.h:304
Definition: FrameLib_Object.h:559
size_t blockSize(void *ptr)
Definition: FrameLib_Memory.cpp:23
void enableOrderingConnections()
Definition: FrameLib_Object.h:331
static bool handlesAudio()
Definition: FrameLib_Object.h:156
U * alloc(unsigned long N)
Definition: FrameLib_Object.h:335
UntypedConnection()
Definition: FrameLib_Object.h:99
FrameLib_Queueable()
Definition: FrameLib_Object.h:18
unsigned long getNumOrderingConnections() const
Definition: FrameLib_Object.h:300
virtual std::string audioInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:163
void setIO(unsigned long nIns, unsigned long nOuts, unsigned long nAudioChans=0)
Definition: FrameLib_Object.h:320
void deleteOrderingConnection(T *object, unsigned long outIdx)
Definition: FrameLib_Object.h:238
virtual ~FrameLib_Object()
Definition: FrameLib_Object.h:121
static std::string formatInfo(const char *verboseStr, const char *briefStr, unsigned long idx, bool verbose)
Definition: FrameLib_Object.h:363
Definition: FrameLib_Object.h:20
void releaseStorage(FrameLib_LocalAllocator::Storage *&storage)
Definition: FrameLib_Object.h:350
T * getConnection(unsigned long idx) const
Definition: FrameLib_Object.h:296
unsigned long getNumAudioOuts() const
Definition: FrameLib_Object.h:140
unsigned long getNumAudioIns() const
Definition: FrameLib_Object.h:139
Definition: FrameLib_Types.h:24
ConnectionResult
Definition: FrameLib_Types.h:26
FrameType
Definition: FrameLib_Types.h:25
static const char * formatInfo(const char *verboseStr, const char *briefStr, bool verbose)
Definition: FrameLib_Object.h:358
Definition: FrameLib_Memory.h:220
ManagedPointer< FrameLib_LocalAllocator, &Global::getAllocator, &Global::releaseAllocator > Allocator
Definition: FrameLib_Context.h:84
Definition: FrameLib_Types.h:24
void add(T *object, Method method)
Definition: FrameLib_Object.h:29
FrameLib_Queueable< T >::Queue Queue
Definition: FrameLib_Object.h:115
unsigned long getNumIns() const
Definition: FrameLib_Object.h:137
static std::string numberedString(const char *str, unsigned long idx)
Definition: FrameLib_Object.h:386
Definition: FrameLib_Types.h:26
Definition: FrameLib_Types.h:26
void * getOwner() const
Definition: FrameLib_Object.h:133
UntypedConnection(U *object, unsigned long index)
Definition: FrameLib_Object.h:100